home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 201 / 201.xpi / modules / preferences.jsm < prev    next >
Text File  |  2010-01-11  |  4KB  |  209 lines

  1. /* You may find the license in the LICENSE file */
  2.  
  3. const EXPORTED_SYMBOLS = [
  4.     'get',
  5.     'getExt',
  6.     'set',
  7.     'setExt',
  8.     'hasUserValue',
  9.     'hasUserValueExt',
  10.     'getChildren',
  11.     'getChildrenExt',
  12.     'reset',
  13.     'resetExt',
  14.     'resetBranch',
  15.     'resetBranchExt',
  16.     'resetAllExt',
  17.     'addObserver',
  18.     'removeObserver',
  19.     'makeObserver'
  20. ];
  21.  
  22. const EXT = 'extensions.dta.';
  23.  
  24. const Cc = Components.classes;
  25. const Ci = Components.interfaces;
  26. const nsIPrefBranch = Ci.nsIPrefBranch;
  27. const nsIPrefBranch2 = Ci.nsIPrefBranch2;
  28.  
  29. const PREF_STRING = nsIPrefBranch.PREF_STRING;
  30. const PREF_INT = nsIPrefBranch.PREF_INT;
  31. const PREF_BOOL = nsIPrefBranch.PREF_BOOL;
  32.  
  33. const SupportsString = Components.Constructor('@mozilla.org/supports-string;1', 'nsISupportsString');
  34.  
  35. const prefs = Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefBranch);
  36.  
  37. function get(key, defaultValue){
  38.     try {
  39.         let rv;
  40.         switch (prefs.getPrefType(key)) {
  41.             case PREF_INT:
  42.                 rv = prefs.getIntPref(key);
  43.                 break;
  44.             case PREF_BOOL:
  45.                 rv = prefs.getBoolPref(key);
  46.                 break;
  47.             default:
  48.                 rv = getMultiByte(key);
  49.                 break;
  50.         }
  51.         if (rv != undefined) {
  52.             return rv;
  53.         }
  54.     } 
  55.     catch (ex) {
  56.         // no-op
  57.     }
  58.     
  59.     return defaultValue;
  60. }
  61.     
  62. function getExt(key, defaultValue) {
  63.         return get(EXT + key, defaultValue);
  64. }
  65.  
  66. function set(key, value){
  67.     if (typeof value == 'number' || value instanceof Number) {
  68.         return prefs.setIntPref(key, value);
  69.     }
  70.     if (typeof value == 'boolean' || value instanceof Boolean) {
  71.         return prefs.setBoolPref(key, value);
  72.     }
  73.     return setMultiByte(key, value);
  74. }
  75.  
  76. function setExt(key, value){
  77.     return set(EXT + key, value);
  78. }
  79.  
  80. function getMultiByte(key, defaultValue){
  81.     try {
  82.         return prefs.getComplexValue(key, Ci.nsISupportsString).data;
  83.     } 
  84.     catch (ex) {
  85.         // no-op
  86.     }
  87.     return defaultValue;
  88. }
  89.  
  90. function setMultiByte(key, value) {
  91.     let str = new SupportsString();
  92.     str.data = value.toString();
  93.     prefs.setComplexValue(key, Ci.nsISupportsString, str);
  94. }
  95.  
  96. function hasUserValue(key) {
  97.     try {
  98.         return prefs.prefHasUserValue(key);
  99.     }
  100.     catch (ex) {
  101.         // no-op
  102.     }
  103.     return false;
  104. }
  105.  
  106. function hasUserValueExt(key) {
  107.     return hasUserValue(EXT + key);
  108. }
  109.  
  110. function getChildren(key) {
  111.     return prefs.getChildList(key, {});
  112. }
  113.  
  114. function getChildrenExt(key) {
  115.     return getChildren(EXT + key);
  116. }
  117.  
  118. function reset(key) {
  119.     try {
  120.         return prefs.clearUserPref(key);
  121.     }
  122.     catch (ex) {
  123.         // no-op
  124.     }
  125.     return false;
  126. }
  127.  
  128.  
  129. function resetExt(key) {
  130.     if (key.search(new RegExp('/^' + EXT + '/')) != 0) {
  131.         key = EXT + key;
  132.     }
  133.     return reset(key);
  134. }
  135.  
  136. function resetBranch(branch) {
  137.     try {
  138.         prefs.resetBranch(branch);
  139.     }
  140.     catch (ex) {
  141.         // BEWARE: not yet implemented in XPCOM 1.8/trunk.
  142.         let children = prefs.getChildList(branch, {});
  143.         for each (let key in children) {
  144.             reset(key);
  145.         }
  146.     }
  147. }
  148.  
  149. function resetBranchExt(branch) {
  150.     resetBranch(EXT + branch);
  151. }
  152.  
  153. function resetAllExt() {
  154.     resetBranchExt('');
  155. }
  156.  
  157. function addObserver(branch, obj) {
  158.     makeObserver(obj);
  159.     prefs.QueryInterface(nsIPrefBranch2).addObserver(branch, obj, true);
  160. }
  161.  
  162. function removeObserver(branch, obj) {
  163.     prefs.QueryInterface(nsIPrefBranch2).removeObserver(branch, obj);
  164. }
  165.  
  166. function makeObserver(obj) {
  167.     try {
  168.         if (
  169.             obj.QueryInterface(Ci.nsISupportsWeakReference)
  170.             && obj.QueryInterface(Ci.nsIObserver)
  171.         ) {
  172.             return;
  173.         }
  174.     }
  175.     catch (ex) {
  176.         // fall-through
  177.     }
  178.     let __QueryInterface = obj.QueryInterface;
  179.     obj.QueryInterface = function(iid) {
  180.         try {
  181.             if (
  182.                 iid.equals(Components.interfaces.nsISupports)
  183.                 || iid.equals(Components.interfaces.nsISupportsWeakReference)
  184.                 || iid.equals(Components.interfaces.nsIWeakReference)
  185.                 || iid.equals(Components.interfaces.nsIObserver)
  186.             ) {
  187.                 return obj;
  188.             }
  189.             if (__QueryInterface) {
  190.                 debug("calling original: " + iid);
  191.                 return __QueryInterface.call(this, iid);
  192.             }
  193.             throw Components.results.NS_ERROR_NO_INTERFACE;
  194.         }
  195.         catch (ex) {
  196.             debug("requested interface not available: " + iid);
  197.             throw ex;
  198.         }
  199.     };
  200.     // nsiWeakReference
  201.     obj.QueryReferent = function(iid) {
  202.         return obj.QueryInterface(iid);
  203.     };
  204.     // nsiSupportsWeakReference
  205.     obj.GetWeakReference = function() {
  206.         return obj;
  207.     };    
  208. }
  209.